package com.cskaoyan.javase.basic._2variable._4detail;

/**
 * 浮点数的精度问题
 * 浮点数之所以存在精度问题,根本原因在于浮点数的有效数字是有限位数的
 * 除此之外,还和二进制的小数的表示有关.
 *
 * 十进制小数转换成二进制小数，规则如下：
 * 十进制正小数（0.开头）转换成二进制，先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * 然后小数部分继续乘2
 * 直到小数部分为0，或者已经达到了最大的位数
 * 最终的结果（0.开头）正序排列
 *
 * 0.1这个十进制小数
 * 0.1 * 2 = 0.2
 * 0.2 * 2 = 0.4
 * 0.4 * 2 = 0.8
 * 0.8 * 2 = 1.6 --> 1
 * 0.6 * 2 = 1.2 --> 1
 * 0.2 * 2 = 0.4
 * ....
 *
 * 所以浮点数有限位数是不能表示的
 *
 * @since 16:51
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        double num1 = 1 - 0.9;
        float num2 = 1 - 0.9F;
        System.out.println(num1);
        System.out.println(num2);

        double a = 0.1;
        float b = 0.1F;
        System.out.println(a == b);

        float a2 = 0.1F;
        // 中间18个0
        float b2 = 0.10000000000000000001F;
        System.out.println(a2 == b2);
    }
}
